--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
vendor/lxmfy/lxmfy/validation.py dev (c9f60cc5) Text, 8.96 KB
T8b949e"""Validation module for LXMFy configuration and best practices."""
Tff7b72import T7ee787logging
Tff7b72from T7ee787dataclasses Tff7b72import Te6edf3dataclass
Tff7b72from T7ee787typing Tff7b72import Te6edf3Any
Tff7b72from T7ee787.T7ee787storage Tff7b72import Te6edf3JSONStorage
Te6edf3logger Tff7b72= Te6edf3loggingTff7b72.Td2a8ffgetLoggerTb4b4b4(Tff7b72__name__Tb4b4b4)
Tf0883e@dataclass
Tff7b72class T56d364ValidationResultTb4b4b4:
T8b949e"""Result of a validation check.
Attributes:
valid (bool): Indicates whether the validation was successful.
messages (list[str]): A list of messages associated with the validation result.
severity (str): The severity level of the validation result ('error', 'warning', or 'info').
"""
Te6edf3validTb4b4b4: Tffa657bool
Te6edf3messagesTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4]
Te6edf3severityTb4b4b4: Tffa657str
Tff7b72class T56d364ConfigValidatorTb4b4b4:
T8b949e"""Validates bot configuration settings."""
Tf0883e@staticmethod
Tff7b72def Td2a8ffvalidate_configTb4b4b4(Te6edf3configTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Te6edf3ValidationResultTb4b4b4]Tb4b4b4:
T8b949e"""Validate the given bot configuration.
Args:
config (Any): The bot configuration object to validate.
Returns:
list[ValidationResult]: A list of validation results.
"""
Te6edf3results Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tffa657getattrTb4b4b4(Te6edf3configTb4b4b4, Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4) Tff7b72< T79c0ff3Tb4b4b4:
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(
Te6edf3ValidationResultTb4b4b4(
Tff7b72FalseTb4b4b4,
Tb4b4b4[Ta5d6ff"Ta5d6ffBot name should be at least 3 characters longTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3announce Tff7b72= Tffa657getattrTb4b4b4(Te6edf3configTb4b4b4, Ta5d6ff"Ta5d6ffannounceTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72if T79c0ff0 Tff7b72< Te6edf3announce Tff7b72< T79c0ff300Tb4b4b4:
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(
Te6edf3ValidationResultTb4b4b4(
Tff7b72FalseTb4b4b4,
Tb4b4b4[
Ta5d6ff"Ta5d6ffAnnounce interval should be at least 300 seconds to avoid network spamTa5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffwarningTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Tffa657getattrTb4b4b4(Te6edf3configTb4b4b4, Ta5d6ff"Ta5d6ffrate_limitTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4) Tff7b72> T79c0ff10Tb4b4b4:
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(
Te6edf3ValidationResultTb4b4b4(
Tff7b72FalseTb4b4b4,
Tb4b4b4[
Ta5d6ff"Ta5d6ffRate limit above 10 messages per minute may be too permissiveTa5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffwarningTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Tffa657getattrTb4b4b4(Te6edf3configTb4b4b4, Ta5d6ff"Ta5d6ffcooldownTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4) Tff7b72< T79c0ff30Tb4b4b4:
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(
Te6edf3ValidationResultTb4b4b4(
Tff7b72FalseTb4b4b4,
Tb4b4b4[Ta5d6ff"Ta5d6ffCooldown period should be at least 30 secondsTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffwarningTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3loggerTff7b72.Td2a8fferrorTb4b4b4(Ta5d6ff"Ta5d6ffError during config validation: Tffd700%sTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(
Te6edf3ValidationResultTb4b4b4(
Tff7b72FalseTb4b4b4,
Tb4b4b4[Ta5d6fffTa5d6ff"Ta5d6ffError validating configuration: Tffd700{Te6edf3eTffd700!s}Ta5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72return Te6edf3results
Tff7b72class T56d364BestPracticesCheckerTb4b4b4:
T8b949e"""Checks for bot implementation best practices."""
Tf0883e@staticmethod
Tff7b72def Td2a8ffcheck_botTb4b4b4(Te6edf3botTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Te6edf3ValidationResultTb4b4b4]Tb4b4b4:
T8b949e"""Check the bot instance for best practices.
Args:
bot (Any): The bot instance to check.
Returns:
list[ValidationResult]: A list of validation results.
"""
Te6edf3results Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Tff7b72not Tffa657getattrTb4b4b4(Te6edf3botTff7b72.Td2a8ffconfigTb4b4b4, Ta5d6ff"Ta5d6ffpermissions_enabledTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(
Te6edf3ValidationResultTb4b4b4(
Tff7b72FalseTb4b4b4,
Tb4b4b4[
Ta5d6ff"Ta5d6ffPermission system is disabled. Consider enabling it for better securityTa5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffwarningTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Tffa657getattrTb4b4b4(Te6edf3botTb4b4b4, Ta5d6ff"Ta5d6ffcommand_prefixTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4) Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(
Te6edf3ValidationResultTb4b4b4(
Tff7b72FalseTb4b4b4,
Tb4b4b4[Ta5d6ff"Ta5d6ffUsing no command prefix may cause high processing overheadTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffwarningTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Tff7b72not Tffa657getattrTb4b4b4(Te6edf3botTb4b4b4, Ta5d6ff"Ta5d6ffadminsTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(
Te6edf3ValidationResultTb4b4b4(
Tff7b72FalseTb4b4b4,
Tb4b4b4[Ta5d6ff"Ta5d6ffNo admin users configured. Bot management will be limitedTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffwarningTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Tffa657getattrTb4b4b4(Te6edf3botTff7b72.Td2a8ffconfigTb4b4b4, Ta5d6ff"Ta5d6ffstorage_typeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffjsonTa5d6ff"Tb4b4b4:
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(
Te6edf3ValidationResultTb4b4b4(
Tff7b72TrueTb4b4b4,
Tb4b4b4[
Ta5d6ff"Ta5d6ffConsider using SQLite storage for better performance with large datasetsTa5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffinfoTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3sig_enabled Tff7b72= Tffa657getattrTb4b4b4(Te6edf3botTff7b72.Td2a8ffconfigTb4b4b4, Ta5d6ff"Ta5d6ffsignature_verification_enabledTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Te6edf3sig_required Tff7b72= Tffa657getattrTb4b4b4(Te6edf3botTff7b72.Td2a8ffconfigTb4b4b4, Ta5d6ff"Ta5d6ffrequire_message_signaturesTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3sig_enabled Tff7b72and Te6edf3sig_requiredTb4b4b4:
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(
Te6edf3ValidationResultTb4b4b4(
Tff7b72TrueTb4b4b4,
Tb4b4b4[
Ta5d6ff"Ta5d6ffStrict signature verification enabled - all messages must be signedTa5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffinfoTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72elif Te6edf3sig_enabled Tff7b72and Tff7b72not Te6edf3sig_requiredTb4b4b4:
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(
Te6edf3ValidationResultTb4b4b4(
Tff7b72TrueTb4b4b4,
Tb4b4b4[
Ta5d6ff"Ta5d6ffSignature verification enabled but not required - unsigned messages will be loggedTa5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffinfoTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72elif Tff7b72not Te6edf3sig_enabledTb4b4b4:
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(
Te6edf3ValidationResultTb4b4b4(
Tff7b72FalseTb4b4b4,
Tb4b4b4[
Ta5d6ff"Ta5d6ffSignature verification is disabled. Consider enabling it for enhanced securityTa5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffwarningTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72return Te6edf3results
Tff7b72class T56d364PerformanceAnalyzerTb4b4b4:
T8b949e"""Analyzes bot configuration for performance optimization opportunities."""
Tf0883e@staticmethod
Tff7b72def Td2a8ffanalyze_botTb4b4b4(Te6edf3botTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Te6edf3ValidationResultTb4b4b4]Tb4b4b4:
T8b949e"""Analyze the bot instance for performance optimization opportunities.
Args:
bot (Any): The bot instance to analyze.
Returns:
list[ValidationResult]: A list of validation results.
"""
Te6edf3results Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3botTb4b4b4, Ta5d6ff"Ta5d6fftransportTa5d6ff"Tb4b4b4) Tff7b72or Tff7b72not Tffa657hasattrTb4b4b4(Te6edf3botTff7b72.Td2a8fftransportTb4b4b4, Ta5d6ff"Ta5d6ffcached_linksTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(
Te6edf3ValidationResultTb4b4b4(
Tff7b72FalseTb4b4b4,
Tb4b4b4[Ta5d6ff"Ta5d6ffLink caching is not enabled. This may impact performanceTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffwarningTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3botTb4b4b4, Ta5d6ff"Ta5d6ffqueueTa5d6ff"Tb4b4b4) Tff7b72and Tffa657getattrTb4b4b4(Te6edf3botTff7b72.Td2a8ffqueueTb4b4b4, Ta5d6ff"Ta5d6ffmaxsizeTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4) Tff7b72< T79c0ff10Tb4b4b4:
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(
Te6edf3ValidationResultTb4b4b4(
Tff7b72FalseTb4b4b4,
Tb4b4b4[Ta5d6ff"Ta5d6ffConsider increasing queue size for better message handlingTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffinfoTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Tb4b4b4(
Tffa657hasattrTb4b4b4(Te6edf3botTb4b4b4, Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4)
Tff7b72and Tffa657hasattrTb4b4b4(Te6edf3botTff7b72.Td2a8ffstorageTb4b4b4, Ta5d6ff"Ta5d6ffbackendTa5d6ff"Tb4b4b4)
Tff7b72and Tffa657isinstanceTb4b4b4(Te6edf3botTff7b72.Td2a8ffstorageTff7b72.Td2a8ffbackendTb4b4b4, Te6edf3JSONStorageTb4b4b4)
Tb4b4b4)Tb4b4b4:
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(
Te6edf3ValidationResultTb4b4b4(
Tff7b72TrueTb4b4b4,
Tb4b4b4[
Ta5d6ff"Ta5d6ffSQLite backend recommended for better performance with large datasetsTa5d6ff"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffinfoTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72return Te6edf3results
Tff7b72def Td2a8ffvalidate_botTb4b4b4(Te6edf3botTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657listTb4b4b4[Te6edf3ValidationResultTb4b4b4]Tb4b4b4]Tb4b4b4:
T8b949e"""Run all validation checks on a bot instance.
Args:
bot (Any): The bot instance to validate.
Returns:
dict[str, list[ValidationResult]]: A dictionary containing validation results for different categories.
"""
Tff7b72tryTb4b4b4:
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffconfigTa5d6ff"Tb4b4b4: Te6edf3ConfigValidatorTff7b72.Td2a8ffvalidate_configTb4b4b4(Te6edf3botTff7b72.Td2a8ffconfigTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffbest_practicesTa5d6ff"Tb4b4b4: Te6edf3BestPracticesCheckerTff7b72.Td2a8ffcheck_botTb4b4b4(Te6edf3botTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffperformanceTa5d6ff"Tb4b4b4: Te6edf3PerformanceAnalyzerTff7b72.Td2a8ffanalyze_botTb4b4b4(Te6edf3botTb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3loggerTff7b72.Td2a8fferrorTb4b4b4(Ta5d6ff"Ta5d6ffValidation error: Tffd700%sTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Tb4b4b4[
Te6edf3ValidationResultTb4b4b4(
Tff7b72FalseTb4b4b4,
Tb4b4b4[Ta5d6fffTa5d6ff"Ta5d6ffError during validation: Tffd700{Te6edf3eTffd700!s}Ta5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffformat_validation_resultsTb4b4b4(Te6edf3resultsTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Tffa657listTb4b4b4[Te6edf3ValidationResultTb4b4b4]Tb4b4b4]Tb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
T8b949e"""Format validation results into a readable string.
Args:
results (dict[str, list[ValidationResult]]): A dictionary containing validation results.
Returns:
str: A formatted string representing the validation results.
"""
Te6edf3output Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3categoryTb4b4b4, Te6edf3checks Tff7b72in Te6edf3resultsTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3outputTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff=== Tffd700{Te6edf3categoryTff7b72.Td2a8ffupperTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff ===Ta5d6ff"Tb4b4b4)
Tff7b72for Te6edf3result Tff7b72in Te6edf3checksTb4b4b4:
Te6edf3prefix Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ff[ERROR]Ta5d6ff"
Tff7b72if Tff7b72not Te6edf3resultTff7b72.Td2a8ffvalid Tff7b72and Te6edf3resultTff7b72.Td2a8ffseverity Tff7b72== Ta5d6ff"Ta5d6fferrorTa5d6ff"
Tff7b72else Ta5d6ff"Ta5d6ff[WARNING]Ta5d6ff"
Tff7b72if Te6edf3resultTff7b72.Td2a8ffseverity Tff7b72== Ta5d6ff"Ta5d6ffwarningTa5d6ff"
Tff7b72else Ta5d6ff"Ta5d6ff[INFO]Ta5d6ff"
Tb4b4b4)
Te6edf3outputTff7b72.Td2a8ffextendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3prefixTffd700}Ta5d6ff Tffd700{Te6edf3msgTffd700}Ta5d6ff" Tff7b72for Te6edf3msg Tff7b72in Te6edf3resultTff7b72.Td2a8ffmessagesTb4b4b4)
Tff7b72return Ta5d6ff"Tffea00\nTa5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3outputTb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────